package jmf;

import java.io.File;
import java.util.ResourceBundle;
import java.util.concurrent.TimeUnit;

public class AdministradorJMF {
	ResourceBundle config = ResourceBundle.getBundle("param");

	private Grabadora grabador;

	private Reproductor reproductor;

	private static AdministradorJMF instancia;
	
	private boolean degugging = false;

	private int nivelRuidoDefault = Integer.valueOf(
			config.getString("BASELINE_RUIDO_DEFAULT")).intValue();

	private int nivelRuido = 0;

	public static synchronized AdministradorJMF getInstance() {
		if (instancia == null) {
			instancia = new AdministradorJMF();
		}
		return instancia;
	}

	private AdministradorJMF() {
		super();
		setDegugging(Boolean.valueOf(config.getString("DEBUG_JMF")));
	}

	public Grabadora getGrabador() {
		return grabador;
	}

	public void setGrabador(Grabadora grabador) {
		this.grabador = grabador;
	}

	public Reproductor getReproductor() {
		return reproductor;
	}

	public void setReproductor(Reproductor reproductor) {
		this.reproductor = reproductor;
	}
	
	public boolean isDegugging() {
		return degugging;
	}

	public void setDegugging(boolean debug) {
		this.degugging = debug;
	}

	public void grabar(final String nombreArchivo,final boolean detectaSilencios) {
		if (!isGrabacionEnCurso()) {
			(new Thread() {
				public void run() {
					grabador = new Grabadora(nombreArchivo);
					configurarDetectorSilencios(detectaSilencios);
					grabador.start();
					if (isDegugging())System.out.println("Grabandoooooooo..........");
					synchronized (grabador) {
						try {
							grabador.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					grabador = null;
					if (isDegugging())System.out.println("Grabacion detenidaaaaaaaaaa........");
				}


			}).start();
		}
	}

	private void configurarDetectorSilencios(boolean detecta) {
		if(detecta){
			int nivel = nivelRuido;
			if (!isNivelRuidoSeteado()){
				nivel = nivelRuidoDefault;
			}
			int segundos = Integer.valueOf(config.getString("SEGUNDOS_DETECTA_SILENCIO")).intValue();
			grabador.setDetectorSilencios(nivel, segundos);
		}
	}
	
	public void detenerGrabacion() {
		if (isGrabacionEnCurso()) {
			Grabadora aux = grabador;
			synchronized (grabador) {
				grabador.notify();
			}
			aux.detener();
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			aux = null;
		}
	}

	public void reproducir(final File archivo) {
		if (!isReproduccionEnCurso()) {
			(new Thread() {
				public void run() {
					setReproductor(new Reproductor(archivo));
					reproductor.start();
					if (isDegugging())System.out.println("Reproduciendoooooo..........");
					synchronized (reproductor) {
						try {
							reproductor.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					reproductor = null;
					if (isDegugging())System.out
					.println("Reproduccion detenidaaaaaaaaaa........");
				}
				
			}).start();
		}
	}

	public void reproducirSerie(File archivo) {
		if (!isReproduccionEnCurso()) {
			setReproductor(new Reproductor(archivo));
			if (isDegugging())System.out.println("Reproduciendoooooo..........");
			reproductor.reproducir();
			reproductor = null;
			if (isDegugging())System.out.println("Finaliza reproduccion..........");
		}
	}

	public void detenerReproduccion() {
		if (isReproduccionEnCurso()) {
			Reproductor aux = reproductor;
			synchronized (reproductor) {
				reproductor.notify();
			}
			aux.detener();
			aux = null;
		}
	}

	public boolean isGrabacionEnCurso() {
		return grabador != null;
	}

	public boolean isReproduccionEnCurso() {
		return reproductor != null;
	}

	public boolean isNivelRuidoSeteado() {
		return nivelRuido != 0;
	}
	
	public void setNivelRuido(int nivel){
		nivelRuido = nivel;
	}

	public void establecerBaseRuido() {
		(new Thread(){
			public void run(){
				grabar("test", false);
				try {
					TimeUnit.SECONDS.sleep(5);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				int promedio = getGrabador().getPromedioGrabacion();
				double d = promedio+(promedio*0.02);
				setNivelRuido(Double.valueOf(d).intValue());
				detenerGrabacion();
			}
		}).start();
	}
	
	public int getPorcentajeDeteccion(){
		int retorno = 0;
		if (isGrabacionEnCurso()){
			retorno = grabador.obtenerPorcentajeDeteccion();
		}
		return retorno;
	}
}
